package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.IncrementalDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbIncremental;
import com.pe.pgn.clubpgn.domain.ClpdPremioIncremental;
import com.pe.pgn.clubpgn.domain.beans.BNIncremental;
import com.pe.pgn.clubpgn.domain.beans.BNPremioIncremental;

@Repository("incrementalDao")
public class IncrementalDaoImpl extends GenericDaoHibernate<ClpbIncremental, Long> implements
		IncrementalDao {
	
	private JdbcTemplate jdbcTemplate;

	public IncrementalDaoImpl() {
		super(ClpbIncremental.class);
	}
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public List<BNIncremental> buscarIncrementales(Long coPrograma, String deIncremental,
			String stIncremental, boolean esInicial){
		
		StringBuffer query = new StringBuffer();
		query.append("select i.id as id, ");
		query.append("		i.de_incremental as deIncremental, ");
		query.append("		i.st_imprime_mensaje as stImprimeMensaje, ");
		query.append("		i.st_incremental as stIncremental, ");
		query.append("		i.va_exclusion_variacion as vaExclusionVariacion, ");
		query.append("		i.va_inclusion_minimo as vaInclusionMinimo, ");
		query.append("		i.va_inclusion_maximo as vaInclusionMaximo, ");
		query.append("		i.va_numero_recordatorios as vaNumeroRecordatorios, ");
		query.append("		p.id as coPrograma, ");
		query.append("		p.de_programa as dePrograma ");
		query.append("	from clpb_incremental i join clpb_programa p on i.co_programa = p.id  ");
		
		if(esInicial){
			
			StringBuffer queryInicial = new StringBuffer();
			queryInicial.append("select * from (").append(query.toString());
			queryInicial.append("	where st_incremental = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			queryInicial.append(" order by i.id desc ");
			queryInicial.append(") where rownum <=").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
			
			query = new StringBuffer(queryInicial.toString());			
		}
		else{
			
			query.append("	where  1 = 1 ");
			if(coPrograma != null && 
					!coPrograma.toString().equalsIgnoreCase(CLPConstantes.FILTRO_ID_COMODIN)){
				
				query.append("  	and i.co_programa = ").append(coPrograma);
			}
			
			if(stIncremental != null 
					&& !stIncremental.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
				
				query.append("  	and i.st_incremental = '").append(stIncremental).append("' ");
			}
			
			if(StringUtils.isNotBlank(deIncremental)){
				
				query.append("  	and upper(trim(i.de_incremental)) like '%").append(deIncremental.trim().toUpperCase()).append("%'");
			}
			query.append(" order by i.id desc ");
		}
		
		List<BNIncremental> incrementales = findListOfBeans(query.toString(), null, BNIncremental.class);
		return incrementales;
		
	}

	public void guardarIncremental(ClpbIncremental incremental){
		
		if(incremental.getId() == null){
			
			incremental.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			incremental.setDaFechaCreacion(Calendar.getInstance());
			
		}else{
			
			incremental.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			incremental.setDaFechaModificacion(Calendar.getInstance());
		}
		
		getHibernateTemplate().saveOrUpdate(incremental);
		getHibernateTemplate().flush();
	}
	
	public void eliminarIncremental(Long id){
		
		StringBuffer update = new StringBuffer("update clpb_incremental set st_incremental = '");
		update.append(CLPConstantes.ST_FALSO).append("', ");
		update.append("	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("', ");
		update.append("	da_fecha_modificacion = sysdate ");
		update.append(" where id = ").append(id);
		
		jdbcTemplate.update(update.toString());
		
		update = new StringBuffer("update clpd_premio_incremental set st_premio_incremental = '");
		update.append(CLPConstantes.ST_FALSO).append("',");
		update.append("	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("', ");
		update.append("	da_fecha_modificacion = sysdate ");
		update.append(" where co_incremental = ").append(id);
		
		jdbcTemplate.update(update.toString());

	}
	
	public ClpbIncremental obtenerIncremental(Long id){
		
		ClpbIncremental incremental = get(id);
		return incremental;
	}

	@SuppressWarnings("unchecked")
	public BNPremioIncremental obtenerDatosIncremental(Long id) {
		
		StringBuffer query = new StringBuffer();
		query.append("select  i.id as coIncremental, ");
		query.append("		i.de_incremental as deIncremental, ");
		query.append("		p.id as coPrograma, ");
		query.append("		p.de_programa as dePrograma");
		query.append("	from clpb_incremental i join clpb_programa p on i.co_programa = p.id  ");
		query.append("	where i.id = ").append(id);
		
		List datosIncrementales = findListOfBeans(query.toString(), null, BNPremioIncremental.class);
		if(!datosIncrementales.isEmpty()){
			
			return (BNPremioIncremental) datosIncrementales.get(0);
		}
		
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<ClpdPremioIncremental> obtenerPremiosPorIncremental(Long id) {
		
		StringBuffer query = new StringBuffer();
		query.append("select id as id, ");
		query.append("		de_premio_incremental as dePremioIncremental, ");
		query.append("		va_cantidad_minima_requerida as vaCantidadMinimaRequerida, ");
		query.append("		va_cantidad_premio as vaCantidadPremio");
		query.append("	from clpd_premio_incremental ");
		query.append("	where co_incremental = ").append(id);
		query.append("		and st_premio_incremental = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		query.append("	order by va_cantidad_premio asc ");
		
		List premios = findListOfBeans(query.toString(), null, ClpdPremioIncremental.class);		
		return premios;
	}

	public Long eliminarPremio(BigDecimal id) {
		
		StringBuffer query = new StringBuffer("select co_incremental from clpd_premio_incremental where id = ");
		query.append(id);
		Long coIncremental = jdbcTemplate.queryForLong(query.toString());
		
		query = new StringBuffer("update clpd_premio_incremental set st_premio_incremental = '");
		query.append(CLPConstantes.ST_FALSO).append("',");
		query.append("	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("', ");
		query.append("	da_fecha_modificacion = sysdate ");
		query.append("where id = ").append(id);
		
		jdbcTemplate.update(query.toString());
		return coIncremental;
	}

	public void guardarPremioIncremental(
			ClpdPremioIncremental clpdPremioIncremental) {

		if(clpdPremioIncremental.getId() == null){
			
			clpdPremioIncremental.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			clpdPremioIncremental.setDaFechaCreacion(Calendar.getInstance());
			clpdPremioIncremental.setStPremioIncremental(Boolean.TRUE);
			
		}else{
			
			clpdPremioIncremental.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			clpdPremioIncremental.setDaFechaModificacion(Calendar.getInstance());
		}
		
		getHibernateTemplate().saveOrUpdate(clpdPremioIncremental);
		getHibernateTemplate().flush();
	}
	
	public boolean esDescripcionPremioRepetido(BNPremioIncremental premioIncremental){
		
		StringBuffer query = new StringBuffer();
		query.append("select count(*) from clpd_premio_incremental ");
		query.append("	where upper(trim(de_premio_incremental)) = '").append(premioIncremental.getDePremioIncremental().toUpperCase()).append("' ");
		query.append("		and co_incremental = ").append(premioIncremental.getCoIncremental());
		query.append("		and st_premio_incremental = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		
		if(premioIncremental.getId() != null && 
				!premioIncremental.getId().equals(BigDecimal.ONE.negate())){
			query.append(" and id != ").append(premioIncremental.getId());
		}
		
		int count = jdbcTemplate.queryForInt(query.toString());
		if(count > 0){
			return Boolean.TRUE;
		}
		return Boolean.FALSE;

	}
	
	public boolean esValorPremioRepetido(BNPremioIncremental premioIncremental){
		
		StringBuffer query = new StringBuffer();
		query.append("select count(*) from clpd_premio_incremental ");
		query.append(" where (va_cantidad_minima_requerida = ").append(premioIncremental.getVaCantidadMinimaRequerida());
		query.append("	or va_cantidad_premio = ").append(premioIncremental.getVaCantidadPremio());
		query.append(") and co_incremental = ").append(premioIncremental.getCoIncremental());
		query.append("	and st_premio_incremental = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		
		if(premioIncremental.getId() != null && 
				!premioIncremental.getId().equals(BigDecimal.ONE.negate())){
			query.append(" and id != ").append(premioIncremental.getId());
		}
		
		int count = jdbcTemplate.queryForInt(query.toString());
		if(count > 0){
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}
}

